<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: 流年 <liu21st@gmail.com>
// +----------------------------------------------------------------------

function output($code = '', $msg = '')
{
    return ['code' => $code, 'msg' => $msg];
}
// 应用公共文件
/**
 * 可逆加密
 * @param  string $data 需要加密的数据
 * @param  string $key  密码
 * @return string       加密后的数据
 */
function mwencrypt($data, $key='xfz61281006')  {  
        $key    =   md5($key);
        $x      =   0;  
        $len    =   strlen($data);  
        $l      =   strlen($key);
        $char ='';
        $str = '';
        for ($i = 0; $i < $len; $i++)  
        {  
            if ($x == $l)   
            {  
                $x = 0;  
            }  
            $char .= $key{$x};  
            $x++;  
        }  
        for ($i = 0; $i < $len; $i++)  
        {  
            $str .= chr(ord($data{$i}) + (ord($char{$i})) % 256);  
        }  
       //var_dump($str );
        return base64_encode($str);  
}  
/**
 * 解密
 * @param  string $data 需要解密的数据
 * @param  string $key  密码
 * @return string       解密后的数据
 */
function mwdecrypt($data, $key='xfz61281006')  {  
        $key = md5($key);  
        $x = 0;  
        $data = base64_decode($data);  
        $len = strlen($data);  
        $l = strlen($key);
        $char ='';
        $str = '';
        for ($i = 0; $i < $len; $i++)  
        {  
            if ($x == $l)   
            {  
                $x = 0;  
            }  
            $char .= substr($key, $x, 1);  
            $x++;  
        }  
        for ($i = 0; $i < $len; $i++)  
        {  
            if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1)))  
            {  
                $str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1)));  
            }  
            else  
            {  
                $str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1)));  
            }  
        }  
        return $str;  
}


//CURL请求
/**
 * CURL请求
 * @param string  url
 * @param array   数据
 * @param string  请求方式  如果不等于post,则使用get请求
 * 
 */
function CURLRequest($url,$params,$post=''){
            
    $SSL = substr($url, 0, 8) == "https://" ? true : false;  //判断是否https连接
    $httpInfo = array();
    $ch = curl_init();                                       //初始化CURL会话
        
    //设置CURL传输选项
    curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT , 60 );
    curl_setopt( $ch, CURLOPT_TIMEOUT , 60);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); 
    if($post){
        curl_setopt( $ch , CURLOPT_POST , true );
        curl_setopt( $ch , CURLOPT_POSTFIELDS ,json_encode($params));
        curl_setopt( $ch , CURLOPT_URL , $url );
    }else{
        $data = '?';
        foreach ($params as $key => $value) {
            $data .= $key.'='.$value.'&';
        }
        curl_setopt( $ch , CURLOPT_URL , $url.$data);
    }
    if ($SSL) { 
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 信任任何证书 
    } 
    
        
    $response = curl_exec( $ch );                                      //执行CURL会话
    curl_close( $ch );                                                 //关闭会话
    $result=json_decode($response,true);                               //返回解析后的数据
    if ($response === FALSE OR empty($response)) {                    //错误返回false
        $result=false;
    }
        
    return $result;
}
/**
* 可以统计中文字符串长度的函数
* @param $str 要计算长度的字符串
* @param $type 计算长度类型，0(默认)表示一个中文算一个字符，1表示一个中文算两个字符
*
*/
function abslength($str)
{
    if(empty($str)){
        return 0;
    }
    if(function_exists('mb_strlen')){
        return mb_strlen($str,'utf-8');
    }
    else {
        preg_match_all("/./u", $str, $ar);
        return count($ar[0]);
    }
}

/**
*    utf-8编码下截取中文字符串,参数可以参照substr函数
*    @param $str 要进行截取的字符串
*    @param $start 要进行截取的开始位置，负数为反向截取
*    @param $end 要进行截取的长度
*/
function utf8_substr($str,$start=0) {
    if(empty($str)){
        return false;
    }
    if (function_exists('mb_substr')){
        if(func_num_args() >= 3) {
            $end = func_get_arg(2);
            return mb_substr($str,$start,$end,'utf-8');
        }
        else {
            mb_internal_encoding("UTF-8");
            return mb_substr($str,$start);
        }      
 
    }
    else {
        $null = "";
        preg_match_all("/./u", $str, $ar);
        if(func_num_args() >= 3) {
            $end = func_get_arg(2);
            return join($null, array_slice($ar[0],$start,$end));
        }
        else {
            return join($null, array_slice($ar[0],$start));
        }
    }
}
/**
* @desc arraySort php二维数组排序 按照指定的key 对数组进行排序
* @param array $arr 将要排序的数组
* @param string $keys 指定排序的key
* @param string $type 排序类型 asc | desc
* @return array
*/
function arraySort($arr, $keys, $type = 'asc') {
    $keysvalue = $new_array = array();
    foreach ($arr as $k => $v){
        $keysvalue[$k] = $v[$keys];
    }
    $type == 'asc' ? asort($keysvalue) : arsort($keysvalue);

    reset($keysvalue);
    foreach ($keysvalue as $k => $v) {
        $new_array[] = $arr[$k];
    }
    return $new_array;
}
/** 
 * ****************** 
 * 1、写入内容到文件,追加内容到文件 
 * 2、打开并读取文件内容 
 * ******************* 
 */  
function save_log($path, $msg)  
{  
    if (! is_dir($path)) {  
        mkdir($path);  
    }  
    if(is_array($msg)){
        $data = '';
        $msg .= implode("",$msg);
    }
    $filename = $path . '/' . date('YmdHi') . '.txt';  
    $content = date("Y-m-d H:i:s")."\r\n".$msg."\r\n \r\n \r\n ";  
    file_put_contents($filename, $content, FILE_APPEND);  
}


/**
 * 指定位置插入字符串
 * @param $str  原字符串
 * @param $i    插入位置
 * @param $substr 插入字符串
 * @return string 处理后的字符串
 */
function insertToStr($str, $i, $substr){
    //指定插入位置前的字符串
    $startstr="";
    for($j=0; $j<$i; $j++){
        $startstr .= $str[$j];
    }
     
    //指定插入位置后的字符串
    $laststr="";
    for ($j=$i; $j<strlen($str); $j++){
        $laststr .= $str[$j];
    }
    //将插入位置前，要插入的，插入位置后三个字符串拼接起来
    $str = $startstr . $substr . $laststr;
     
    //返回结果
    return $str;
}


/**
 * 获取相应时间范围的时间戳
 * @param  [type] $when 日期（用英文表示，如果传过来的值为空，默认返回本月的时间戳）
 * @return [type]       [description]
 */
function gettimestamp($when=null){
    switch ($when) {
        case 'thisweek':
            //本周
            $starttime = mktime(0, 0 , 0,date("m"),date("d")-date("w")+1,date("Y")); 
            $endtime = mktime(23,59,59,date("m"),date("d")-date("w")+7,date("Y"));
        break;

        case 'thismonth':
            //本月
            $starttime = mktime(0, 0 , 0,date("m"),1,date("Y"));
            $endtime = mktime(23,59,59,date("m"),date("t"),date("Y"));
        break;
        
        case 'today':
            //今天
            $starttime = strtotime(date("Y-m-d", time())); 
            $endtime = strtotime(date("Y-m-d 23:59:59", time()));
        break;

        case 'thisyear':
            //今年
            $starttime = mktime(0, 0 , 0,1,1,date("Y"));
            $endtime = mktime(23,59,59,12,31,date("Y"));
        break;

        case 'lastmonth':
            //上月
            $starttime = mktime(0, 0 , 0,date("m")-1,1,date("Y"));
            $endtime = mktime(23,59,59,date("m") ,0,date("Y"));
        break;

        case 'lastweek':
            //上周
            $starttime = mktime(0, 0 , 0,date("m"),date("d")-date("w")+1-7,date("Y")); 
            $endtime = mktime(23,59,59,date("m"),date("d")-date("w"),date("Y"));
        break;

        case 'yesterday':
            //昨天
            $starttime = mktime(0,0,0,date("m"),date("d")-1,date("Y"));
            $endtime = mktime(23,59,59,date("m"),date("d")-1,date("Y"));
        break;

        case 'lastyear':
            //去年
            $starttime = mktime(0, 0 , 0,1,1,date("Y")-1);
            $endtime = mktime(23,59,59,12,31,date("Y")-1);
        break;

        default:
            //本月
            $starttime = mktime(0, 0 , 0,date("m"),1,date("Y"));
            $endtime = mktime(23,59,59,date("m"),date("t"),date("Y"));
        break;
    }
    $data['starttime'] = $starttime;
    $data['endtime'] = $endtime;
    return $data;

}
/************************************************************** 
 * 
 *  使用特定function对数组中所有元素做处理 
 *  @param  string  &$array     要处理的字符串 
 *  @param  string  $function   要执行的函数 
 *  @return boolean $apply_to_keys_also     是否也应用到key上 
 *  @access public 
 * 
 *************************************************************/  
function arrayRecursive(&$array, $function, $apply_to_keys_also = false)  
{  
    static $recursive_counter = 0;  
    if (++$recursive_counter > 1000) {  
        die('possible deep recursion attack');  
    }  
    foreach ($array as $key => $value) {  
        if (is_array($value)) {  
            arrayRecursive($array[$key], $function, $apply_to_keys_also);  
        } else {  
            $array[$key] = $function($value);  
        }  
   
        if ($apply_to_keys_also && is_string($key)) {  
            $new_key = $function($key);  
            if ($new_key != $key) {  
                $array[$new_key] = $array[$key];  
                unset($array[$key]);  
            }  
        }  
    }  
    $recursive_counter--;  
}  
/************************************************************** 
 * 
 *  将数组转换为JSON字符串（兼容中文） 
 *  @param  array   $array      要转换的数组 
 *  @return string      转换得到的json字符串 
 *  @access public 
 * 
 *************************************************************/  
function jsones($array) {  
    arrayRecursive($array, 'urlencode', true);  
    $json = json_encode($array);  
    return urldecode($json);  
}
function object_to_array($obj){
           $_arr = is_object($obj)? get_object_vars($obj) :$obj;
           foreach ($_arr as $key => $val){
               $val=(is_array($val)) || is_object($val) ? object_to_array($val) :$val;
               $arr[$key] = $val;
           }
           return $arr;
}

/*
	自定义复杂MD5加密函数
*/
function md123($sstr){

	$md_asc='';

	$mds=md5('www.huayucc.com@@'.$sstr.'www.meiweima.com##');
	$mds=md5('www.xinnar.com'.$mds.'adkas@@kjodsaj');
	$mds = md5('xinnar@$%'.$mds.'huayucc!@#$%^');
	$mds = md5('uguays@$%'.$mds.'aihdish!@#$%^');
	$mds = md5('gudgusa'.$mds.'ncxsugfdy');
	for($i=1;$i< strlen($mds);$i++){

		$md_asc.=168/ord(substr($mds,$i,1));

	}

	return md5($md_asc);
}
/**
  +----------------------------------------------------------
 * 生成随机字符串
  +----------------------------------------------------------
 * @param int       $length  要生成的随机字符串长度
 * @param string    $type    随机码类型：0，数字+大小写字母；1，数字；2，小写字母；3，大写字母；4，特殊字符；-1，数字+大小写字母+特殊字符
  +----------------------------------------------------------
 * @return string
  +----------------------------------------------------------
 */
function randCode($length = 5, $type = 0) {
    $arr = array(1 => "0123456789", 2 => "abcdefghijklmnopqrstuvwxyz", 3 => "ABCDEFGHIJKLMNOPQRSTUVWXYZ", 4 => "~@#$%^&*(){}[]|");
    if ($type == 0) {
        array_pop($arr);
        $string = implode("", $arr);
    } elseif ($type == "-1") {
        $string = implode("", $arr);
    } else {
        $string = $arr[$type];
    }
    $count = strlen($string) - 1;
    $code = '';
    for ($i = 0; $i < $length; $i++) {
        $code .= $string[rand(0, $count)];
    }
    return $code;
}
/**  
 * 获取客户端浏览器信息 添加win10 edge浏览器判断  
 * @return string   
 */  
function get_broswer(){  
     $sys = $_SERVER['HTTP_USER_AGENT'];  //获取用户代理字符串  
     if (stripos($sys, "Firefox/") > 0) {  
         preg_match("/Firefox\/([^;)]+)+/i", $sys, $b);  
         $exp[0] = "Firefox";  
         $exp[1] = $b[1];  //获取火狐浏览器的版本号  
     } elseif (stripos($sys, "Maxthon") > 0) {  
         preg_match("/Maxthon\/([\d\.]+)/", $sys, $aoyou);  
         $exp[0] = "傲游";  
         $exp[1] = $aoyou[1];  
     } elseif (stripos($sys, "MSIE") > 0) {  
         preg_match("/MSIE\s+([^;)]+)+/i", $sys, $ie);  
         $exp[0] = "IE";  
         $exp[1] = $ie[1];  //获取IE的版本号  
     } elseif (stripos($sys, "OPR") > 0) {  
             preg_match("/OPR\/([\d\.]+)/", $sys, $opera);  
         $exp[0] = "Opera";  
         $exp[1] = $opera[1];    
     } elseif(stripos($sys, "Edge") > 0) {  
         //win10 Edge浏览器 添加了chrome内核标记 在判断Chrome之前匹配  
         preg_match("/Edge\/([\d\.]+)/", $sys, $Edge);  
         $exp[0] = "Edge";  
         $exp[1] = $Edge[1];  
     } elseif (stripos($sys, "Chrome") > 0) {  
             preg_match("/Chrome\/([\d\.]+)/", $sys, $google);  
         $exp[0] = "Chrome";  
         $exp[1] = $google[1];  //获取google chrome的版本号  
     } elseif(stripos($sys,'rv:')>0 && stripos($sys,'Gecko')>0){  
         preg_match("/rv:([\d\.]+)/", $sys, $IE);  
             $exp[0] = "IE";  
         $exp[1] = $IE[1];  
     }else {  
        $exp[0] = "未知浏览器";  
        $exp[1] = "";   
     }  
     return $exp[0].'('.$exp[1].')';  
} 
/**  
 * 获取客户端操作系统信息包括win10  
 * @return string   
 */  
function get_os(){  
$agent = $_SERVER['HTTP_USER_AGENT'];  
    $os = false;  
   
    if (preg_match('/win/i', $agent) && strpos($agent, '95'))  
    {  
      $os = 'Windows 95';  
    }  
    else if (preg_match('/win 9x/i', $agent) && strpos($agent, '4.90'))  
    {  
      $os = 'Windows ME';  
    }  
    else if (preg_match('/win/i', $agent) && preg_match('/98/i', $agent))  
    {  
      $os = 'Windows 98';  
    }  
    else if (preg_match('/win/i', $agent) && preg_match('/nt 6.0/i', $agent))  
    {  
      $os = 'Windows Vista';  
    }  
    else if (preg_match('/win/i', $agent) && preg_match('/nt 6.1/i', $agent))  
    {  
      $os = 'Windows 7';  
    }  
      else if (preg_match('/win/i', $agent) && preg_match('/nt 6.2/i', $agent))  
    {  
      $os = 'Windows 8';  
    }else if(preg_match('/win/i', $agent) && preg_match('/nt 10.0/i', $agent))  
    {  
      $os = 'Windows 10';#添加win10判断  
    }else if (preg_match('/win/i', $agent) && preg_match('/nt 5.1/i', $agent))  
    {  
      $os = 'Windows XP';  
    }  
    else if (preg_match('/win/i', $agent) && preg_match('/nt 5/i', $agent))  
    {  
      $os = 'Windows 2000';  
    }  
    else if (preg_match('/win/i', $agent) && preg_match('/nt/i', $agent))  
    {  
      $os = 'Windows NT';  
    }  
    else if (preg_match('/win/i', $agent) && preg_match('/32/i', $agent))  
    {  
      $os = 'Windows 32';  
    }  
    else if (preg_match('/linux/i', $agent))  
    {  
      $os = 'Linux';  
    }  
    else if (preg_match('/unix/i', $agent))  
    {  
      $os = 'Unix';  
    }  
    else if (preg_match('/sun/i', $agent) && preg_match('/os/i', $agent))  
    {  
      $os = 'SunOS';  
    }  
    else if (preg_match('/ibm/i', $agent) && preg_match('/os/i', $agent))  
    {  
      $os = 'IBM OS/2';  
    }  
    else if (preg_match('/Macintosh/i', $agent) && preg_match('/Mac OS X/i', $agent))  
    {  
      $os = 'Mac OS';  
    }  
    else if (preg_match('/PowerPC/i', $agent))  
    {  
      $os = 'PowerPC';  
    }  
    else if (preg_match('/AIX/i', $agent))  
    {  
      $os = 'AIX';  
    }  
    else if (preg_match('/HPUX/i', $agent))  
    {  
      $os = 'HPUX';  
    }  
    else if (preg_match('/NetBSD/i', $agent))  
    {  
      $os = 'NetBSD';  
    }  
    else if (preg_match('/BSD/i', $agent))  
    {  
      $os = 'BSD';  
    }  
    else if (preg_match('/OSF1/i', $agent))  
    {  
      $os = 'OSF1';  
    }  
    else if (preg_match('/IRIX/i', $agent))  
    {  
      $os = 'IRIX';  
    }  
    else if (preg_match('/FreeBSD/i', $agent))  
    {  
      $os = 'FreeBSD';  
    }  
    else if (preg_match('/teleport/i', $agent))  
    {  
      $os = 'teleport';  
    }  
    else if (preg_match('/flashget/i', $agent))  
    {  
      $os = 'flashget';  
    }  
    else if (preg_match('/webzip/i', $agent))  
    {  
      $os = 'webzip';  
    }  
    else if (preg_match('/offline/i', $agent))  
    {  
      $os = 'offline';  
    }  
    else  
    {  
      $os = '未知操作系统';  
    }  
    return $os;    
}
/**  
 * 获取客户端IP地址 
 * @return string   
 */  
function get_ip()  
{  
    global $ip;  
    if (getenv("HTTP_CLIENT_IP"))  
        $ip = getenv("HTTP_CLIENT_IP");  
    else if(getenv("HTTP_X_FORWARDED_FOR"))  
        $ip = getenv("HTTP_X_FORWARDED_FOR");  
    else if(getenv("REMOTE_ADDR"))  
        $ip = getenv("REMOTE_ADDR");  
    else $ip = "未知";  
    return $ip;  
}
/**
 * from 表单提交回调
 *
 * @param string $callback
 * @param $msg
 * @param int $res
 * @param bool $exit_flag
 */
function exit_msg_callback($callback = 'callback', $msg, $res = 0, $exit_flag = true) {
    $res = array(
        'res' => $res,
        'msg' => $msg
    );
    $str = "<script type='text/javascript'>top.".htmlspecialchars($callback)."(".json_encode($res).");</script>";

    if($exit_flag) {
        exit($str);
    } else{
        echo $str;
    }
}
//添加操作日志内容包括(模块、控制器、方法、操作用户、操作内容、IP地址、操作系统、创建时间)
use think\Db;
function set_logs($oid,$m,$c,$action,$uid,$querystring,$ip,$os){
    $logsdata['oid'] = $oid;
    $logsdata['model'] = $m;
    $logsdata['controller'] = $c;
    $logsdata['action'] = $action;
    $logsdata['userid'] = $uid;
    $logsdata['querystring'] = $querystring; 
    $logsdata['ip'] = $ip;
    $logsdata['os'] = $os;
    $logsdata['create_time'] = time();
    Db::name('logs')->insert($logsdata);
}

if (!function_exists('debug_file')) {
    /**
     * 文件调试
     * @param $content
     */
    function debug_file($content, $fileName = 'error', $ext = 'txt')
    {
        $msg = '[' . date('Y-m-d H:i:s', time()) . '] [ DEBUG ] ';
        $pach = './';
        file_put_contents($pach . $fileName . '.' . $ext, $msg . print_r($content, true) . "\r\n", FILE_APPEND);
    }
}

//选择自动侦测当前语言
\think\Lang::detect();
